/*
 * XJSysHelper.cpp
 *
 *  Created on: 2015年9月24日
 *      Author: Administrator
 */

#include "XJSysHelper.h"
#include <sys/syscall.h>
// 支持 timeGetTime() 函数
#ifdef  _WIN32
#ifdef _WIN32_WCE
	#include <Mmsystem.h>
	#pragma comment(lib, "Mmtimer")
#else
	#include <MmSystem.h>
	#pragma comment(lib, "Winmm")
#endif
#endif

namespace XJUtilClass {

// 获取线程号
unsigned long GetCurrentThreadId(){
#ifdef _WIN32
	return ::GetCurrentThreadId();
#else
	// return pthread_self();
	return syscall(SYS_gettid);
#endif
}

unsigned long  SysGetNumberOfProcessors()
{
#ifdef _WIN32
	SYSTEM_INFO si;
	SysGetSystemInfo(&si);

	return si.dwNumberOfProcessors;
#else
	return sysconf(_SC_NPROCESSORS_CONF);// CPU个数
	//sysconf(_SC_NPROCESSORS_ONLN);// 可用CPU个数
#endif
}

unsigned long  SysGetPageSize()
{
#ifdef _WIN32
	SYSTEM_INFO si;
	SysGetSystemInfo(&si);
	return si.dwPageSize;
#else
	return getpagesize();
	// sysconf(_SC_PAGESIZE);
#endif
}


// 获取系统启动时间(毫秒)
unsigned long TimeGetTime(){
#ifdef  _WIN32
	return ::timeGetTime();
#else
	struct timespec t;
	clock_gettime(CLOCK_MONOTONIC, &t);
	return t.tv_sec*1000+t.tv_nsec/1000000;
#endif
}
/**********************************
描述: 获取当前时间与原始时间的时间差
参数:
		dwOriginal	: 原始时间（毫秒），通常用 timeGetTime() 或 GetTickCount() 获取

返回值:	与当前 timeGetTime() 之间的时间差
**********************************/
unsigned long GetTimeGap32(unsigned long dwOriginal){
	return TimeGetTime() - dwOriginal;
}

#ifdef _WIN32
void SysGetSystemInfo(LPSYSTEM_INFO pInfo)
{
	ASSERT(pInfo != nullptr);
	GetNativeSystemInfo(pInfo);
}



#if _MSC_VER < 1800

bool SysGetOSVersionInfo(LPOSVERSIONINFO pInfo, bool bInfoEx)
{
	ASSERT(pInfo != nullptr);

	pInfo->dwOSVersionInfoSize = bInfoEx ? sizeof(LPOSVERSIONINFOEX) : sizeof(LPOSVERSIONINFO);
	return ::GetVersionEx(pInfo);
}

unsigned long  SysGetOSVersion()
{
	OSVERSIONINFO vi;
	DWORD dwOSVersion = 0;

	if(SysGetOSVersionInfo(&vi))
		dwOSVersion = (vi.dwMajorVersion << 16) + vi.dwMinorVersion;

	return dwOSVersion;
}
#endif
#endif

} /* namespace XJUtilClass */
